/* eslint-disable */
import Text from "@/lang/layers/text";
import {NullPointerException} from "@/lang/core/exception";

let container = {};

/**
 * 字符串格式化函数工厂
 *
 * 需要格式化的字符千千万，这个类的意义不是为了满足一切需求，
 * 而是为了快速完成常见的业务，专用的格式化函数，还是尽量在业务上处理。
 *
 * @constructor
 */
let Formatter = function () {
};


/**
 * 注册一个 formatter
 *
 * @param name{string}  格式化函数名称
 * @param fun{Function} 格式化函数
 */
Formatter.prototype.register = function (name, fun) {
    container[name] = fun;
};

/**
 * 注销一个 formatter
 *
 * @param name{string}  格式化函数名称
 */
Formatter.prototype.unregister = function (name) {
    delete container[name];
};

/**
 * 格式化数据
 *
 * @param name{string}                  格式化函数名称
 * @param val{any}                      需要格式化的数据
 * @return {String|Number}              格式化之后的结果
 */
Formatter.prototype.format = function (name, val) {
    if (Layers.isBlank(name)) {
        return val
    } else {
        let fun = container[name];
        if (fun === undefined) {
            throw new NullPointerException('formatter is undefined：' + name);
        } else {
            return fun(val);
        }
    }
};

const formatter = new Formatter();

/**
 * 处理 date 格式的日期
 *
 * @param date{Date} 日期
 * @returns {string}
 */
formatter.register("date", Text.date);

/**
 * 处理 datetime 格式的日期
 *
 * @param date{Date} 日期
 * @returns {string}
 */
formatter.register("datetime", Text.datetime);

/**
 * 处理 date 格式的日期
 *
 * @param date{Date} 日期
 * @returns {string}
 */
formatter.register("compact-date", Text.compactDate);

/**
 * 处理 datetime 格式的日期
 *
 * @param date{Date} 日期
 * @returns {string}
 */
formatter.register("compact-datetime", Text.compactDatetime);

/**
 * 处理日期对象
 *
 * @param date{object} 日期对象
 * @returns {string}
 */
formatter.register("object-datetime", Text.objectToDatetime);

/**
 * 处理日期对象
 *
 * @param date{object} 日期对象
 * @returns {string}
 */
formatter.register("object-date", Text.objectToDate);

/**
 * thousand-separator 千位分隔符
 *
 * @param number{number} 数字
 * @returns {string}
 */
formatter.register("commas-num", Text.numWithCommas);

/**
 * round-half-up 四舍五入，保留整数
 *
 * @param number{number} 数字
 * @returns {number}
 */
formatter.register("round", Text.round);

/**
 * round-half-up 四舍五入，保留 2 位小数
 *
 * @param number{number} 数字
 * @returns {number}
 */
formatter.register("round2", Text.round2);

/**
 * 保留万位以上的数字，这里暂不考虑增加万元单位，因为可能会导致界面不美观
 *
 * @param number{number} 数字
 * @returns {string}
 */
formatter.register("myriad", Text.myriad);

export default formatter;